<%@page import="java.sql.*" errorPage="error.jsp" %>
<%@page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据库操作</title>
    <style>
        h1{
            color:red;
        }
        table{
            border: 3px double red;
            margin: 0;
        }
        tr>:first-child{
            text-align: center;
        }
        th,td{
            border-right: 1px dotted red;
            border-bottom: 1px dotted red;
            padding: 6px;
            margin: 0;
        }
        th{
            background-color: yellow;
        }
        .result{
            color: #666;
        }
    </style>
</head>
<body>
<h1>命令行执行数据库操作</h1>
<p>执行结果如下：</p>
<%
String sql=request.getParameter("sql"); //要执行的多条sql语句
String[]ss= sql.split(";"); //一条一条的语句放在数组中
int index=-1; //从数组中取要执行sql语句的索引
Class.forName("com.mysql.cj.jdbc.Driver");
try(Connection cn=DriverManager.getConnection("jdbc:mysql://localhost:3306/?allowMultiQueries=true", "root", "12qwas");
Statement st=cn.createStatement()){
    boolean flag= st.execute(sql);
    while(true){
        if(++index<ss.length){
            out.print("<p class='title'>"+ss[index]+"</p>");
        }
        if(flag){ //语句执行的结果是ResultSet
            try(ResultSet rs=st.getResultSet()){
                ResultSetMetaData md=rs.getMetaData();//获取ResultSet的元数据
                int gs=md.getColumnCount();//获取字段的个数

                out.print("<table cellspacing='0' class='result'><tr>");
                for(int i=1;i<=gs;++i){
                    out.print("<th>"+md.getColumnLabel(i)+"</th>");
                }
                out.print("</tr>");
                while(rs.next()){
                    out.print("<tr>");
                    for(int i=1;i<=gs;++i){
                        out.print("<td>"+rs.getObject(i)+"</td>");
                    }
                    out.print("</tr>");
                }
                out.print("</table>");
            }
        }else{ //语句执行的结果就是一个整数，表示的就是受影响的行数
            int count=st.getUpdateCount(); //获取受影响的行数
            if(count==-1)break; //没有更多的执行结果
            out.print("<p class='result'>受影响的行数为："+count+"</p>");
        }
        flag=st.getMoreResults(); //获取下条语句执行的结果
    }
}
%>
</body>
</html>